(function ($) {

	var oiv_id = 0;
	var oiv_title = '';
	
	var inv_area_full = true;

    function Outinvoice(area_id, caller) {
        var vdiv = area_id+'Tab';
		var area = $('#'+area_id);
		var me = this;

		area.css({'overflow':'hidden'})
		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');
        
		var pager_id = '#' + vdiv + 'Pager';
		var pager = $(pager_id);
        var el_cli_id;
        var el_cli_name;
        var cli_name = '';
        var el_build_id;
        var el_build_name;
        var build_name = '';
		var el_inv_date;

        var el_status;
		var ai_status = [0,1,2,3,4];
		var as_status = ['Все','Не оплачен','Частично','Оплачен','Переплата'];
		var op_status = ai_status[0]+':'+as_status[0];
		for( var i=1; i<ai_status.length; i++)
			op_status += ';'+ai_status[i]+':'+as_status[i];

		var	pm_type = '';
		var	el_pm_type;
		
        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
        var col_names = ['ID', 'Статус', 'Дата счета', '№ Счета', 'На сумму', 'Получено', 'Тип', 'Подразд.', 'ID Клиента', 'Заказчик, клиент', 
						'ID Объекта', 'Объект', 'Назначение', 'Договор', 'Комментарий'];
        var col_model = [
		    { name: 'id', index: 'oiv_id', hidden: true, width: 1, editable: false, fixed: true },
		    { name: 'status', index: 'status', hidden: false, width: 80, fixed: true, 
				sortable: true, search: true, editable: false, stype:'select', 
				searchoptions:{value:op_status},
				editoptions: { dataInit: function (el) { el_status = el; } },
				formoptions: { label: '<div class="jqg-form-label">Статус изделия</div>'},
				formatter:function(v) {
					for(var i=0; i<ai_status.length; i++)
						if( ai_status[i] == v) return as_status[i];
					return 'Ошибка!!!';
				},
				unformat:function( v ) {
					for(var i=0; i<ai_status.length; i++)
						if( as_status[i] == v) return ai_status[i];
					return 999;
				}

			},
			{ name: 'oiv_inv_date', index:'oiv_inv_date', hidden: false, width:100, editable: true,
            	editoptions: { style: "width:250px;", dataInit: function (el) { el_inv_date = el; } },
				formoptions: { label: '<div class="jqg-form-label">Дата счета</div>'}
			},         
		    { name: 'oiv_inv_num', index: 'oiv_inv_num', hidden: false, width: 100, editable: true,
            	editoptions: { maxlength: "32", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Номер счета</div>'}
		    },
		    { name: 'oiv_amount', index: 'oiv_amount', hidden: false, width: 80, editable: true,
            	editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Сумма счета</div>'}
		    },
		    { name: 'oiv_paid', index: 'oiv_paid', hidden: false, width: 80, editable: false,
            	editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Получено</div>'}
		    },
		    { name: 'oiv_pm_type', index: 'oiv_pm_type', hidden: false, width: 80, editable: true,
            	editoptions: { maxlength: "16", style: "width:250px;", dataInit: function (el) { el_pm_type = el; } },
				formoptions: { label: '<div class="jqg-form-label">Вид платежа</div>'}
		    },
		    { name: 'oiv_dep_id', index: 'oiv_dep_id', hidden: false, width: 80,  
				sortable: true, search: true, stype:'select', editable: true, edittype: 'select', 
				searchoptions:{value:"0:Все", dataInit: set_dep_list }, editoptions: { value:"0:", style: "width:260px;" },
				formoptions: { label: '<div class="jqg-form-label">Подразделение</div>'}
			},
		    { name: 'oiv_cli_id', index: 'oiv_cli_id', hidden: true, width: 50, editable: true,
		        editoptions: { maxlength: "16", dataInit: function (el) { el_cli_id = el; } }
		    },
		    { name: 'cli_name', index: 'cli_name', hidden: false, width: 150, editable: true,
		        editoptions: { maxlength: "64", style: "width:250px;", dataInit: function (el) { el_cli_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Заказчик, клиент</div>'}
		    },
		    { name: 'oiv_build_id', index: 'oiv_build_id', hidden: true, width: 50, editable: true,
		        editoptions: { maxlength: "16", dataInit: function (el) { el_build_id = el; } }
		    },
		    { name: 'build_name', index: 'build_name', hidden: false, width: 100, editable: true,
		        editoptions: { maxlength: "64", style: "width:250px;", dataInit: function (el) { el_build_name = el; } },
				formoptions: { label: '<div class="jqg-form-label">Название объекта</div>'}
		    },
		    { name: 'oiv_content', index: 'oiv_content', hidden: false, width: 150, editable: true,
            	editoptions: { maxlength: "64", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Назначение платежа</div>'}
		    },
		    { name: 'oiv_contract', index: 'oiv_contract', hidden: false, width: 150, editable: true,
            	editoptions: { maxlength: "64", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Договор</div>'}
		    },
		    { name: 'oiv_comment', index: 'oiv_comment', hidden: false, width: 200, editable: true,
		        editoptions: { maxlength: "128",  style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Комментарий</div>'}
		    }
        ];

        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'outinvoice/index' },
            emptyrecords: true,
            autowidth: false,
            //		    scrollOffset: 22,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 30,
            multiboxonly: true,
//			multikey: 'ctrlKey',
            mtype: 'POST',
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 25,
            rowList: [25, 50, 200, 1000, 10000],
            //		    viewrecords: true,
            loadui: 'disable',
            toolbar: [false, 'top'],
			toppager: false,
            filterbar: false,
            shrinkToFit: false,
            height: $('#'+area_id).innerHeight() - 77,
            width: $('#'+area_id).innerWidth() - 2,
            sortname: 'oiv_inv_date',
            sortorder: 'desc',
            sortable: true,
            caption: '',
            loadError: function () {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
				var i = 0;
                switch( data.userdata.errcode ) {
                    case 0:
// Restore selections of the picked row
						if( oiv_id ) {
							var ids = gritab.getDataIDs();
							var exist = false;
							for( i=0; i<ids.length; i++ ) {
								if( ids[i] == oiv_id ) { exist = true; break; }
							}
							if( exist )
								gritab.setSelection( oiv_id );
							else
								ClearSlave();
						}
// Bind qtip to build_name
						$('#'+vdiv+' td[aria-describedby="'+vdiv+'_build_name"]').each( function() { 
							$(this).qtip({
								style: { classes: 'qtip-jtools' },
								position: {	target: 'mouse', adjust: { y: -24, x: 8 } },
								content: {
									text: function(event, api) {
										$.post('index.php', { q: 'builds/find', term: $(this).text(), exactly: true },
										function (rsp, textStatus) {
											if (rsp.errcode) { api.set('content.text', rsp.errmess); }
											api.set('content.text', 
												rsp.data[0].address != '' ? rsp.data[0].address : '! Расшифровка не задана');
										}, 
										'json');
										return "Loading ...";
									}
								}
							});
						});
						
// Bind qtip to oiv_pm_type
						$('#'+vdiv+' td[aria-describedby="'+vdiv+'_oiv_pm_type"]').each( function() { 
							$(this).qtip({
								style: { classes: 'qtip-jtools' },
								position: {	target: 'mouse', adjust: { y: -24, x: 8 } },
								content: {
									text: function(event, api) {
										$.post('index.php', { q: 'payments/findallitp', term: $(this).text(), exactly: true },
										function (rsp, textStatus) {
											if (rsp.errcode) { api.set('content.text', rsp.errmess); }
											api.set('content.text', 
												rsp.data[0].itp_descr != '' ? rsp.data[0].itp_descr : '! Расшифровка не задана');
										}, 
										'json');
										return "Loading ...";
									}
								}
							});
						});
						
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32' );
                        break;
                }
            },
            ondblClickRow: function (id, iRow, iCol) {
                $('#' + vdiv).jqGrid('editGridRow', id,
                {
					width: 450,
					resize: false,
                    modal: true,
                    jqModal: true,
//                    zIndex: app.jqgrid_form_min_z_index,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
// Autocomplete Select savekey must be disabled
//                    savekey: [true, 13],
                    editData: { q: 'outinvoice/update' },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
					beforeSubmit: TestNewData, 
                    afterSubmit: responseOnSubmit,
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
                }
                );
            },
			onSelectRow: function( id, st, e ) {
				if( st ) {
					oiv_id = id;
					oiv_title = gritab.getCell( id, 'oiv_inv_num' )+' от '+gritab.getCell( id, 'oiv_inv_date' );
					caller.RefreshSlave();
				}
				else ClearSlave();
			}
			
        };

// Очистка таблицы платежей
		function ClearSlave() {
			oiv_id = 0;
			oiv_title = '';
			caller.RefreshSlave();
		}
		
		function FormCentering( form_id ) {
			var wh = $(window).height();
			var ww = $(window).width();
			var fmdlg = $(form_id);
			var fh = fmdlg.height();
			var fw = fmdlg.width();
			fmdlg.css({	'top': (wh - fh)/2,	'left': (ww -fw)/2 });
		}
		
		function onShowEditForm(fm) {
            BindCalendar(fm, el_inv_date);
			SetClientsHack();
			SetBuildHack();
			SetPmTypeHack();
            $('div#editmod' + vdiv).css({'overflow':'visible'}).shadow();
			FormCentering('div#editmod' + vdiv);
		}
		        
		function onCloseEditForm() {
			$(el_cli_name).autocomplete( "destroy" ).unbind();
			$(el_build_name).autocomplete( "destroy" ).unbind();
			$(el_pm_type).autocomplete( "destroy" ).unbind();
			$(el_inv_date).datepicker( "destroy" ).unbind();
			return true;
		}
		
		function onShowDelForm() {
            $('div#delmod' + vdiv).shadow();
			FormCentering('div#delmod' + vdiv);
/*
            $('#DelTbl_' + vdiv + ' tr:eq(2) td').html(
                    '<p style="font-weight:700; text-align:center;">ВНИМАНИЕ !!!</p>' +
                    'Удаление записи(сей)  в этой таблице повлечет за собой<br>' +
                    'удаление соответствующих записей в таблице "Архив цен"' +
                    '<p style="text-align:center;">Выполнить удаление ?</p>'
            );
*/				
		}
		
// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Запрашиваем список департаментов
		function set_dep_list( o ) {
			var sel = $(o);
			sel.height(20);
			
			$.post('index.php', { q: 'outinvoice/getdeplist' },
				function (rsp, textStatus) {
					if( typeof rsp != 'object' ) rsp = $.parseJSON(rsp);
					if (rsp.errcode) {
						if (rsp.errcode == '999') { alert(rsp.errmess); }
						else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
						return;
					}
					if (rsp.data) {
						var d = rsp.data;
						var edata = '';
						sel.empty().append('<option value="0">Все</option>');
						for( var i=0; i<d.length; i++) {
							sel.append('<option value="'+d[i].value+'">'+d[i].name+'</option>');
							edata += ( edata ? ';' : '' )+d[i].value+':'+d[i].name;
						}
						$('#' + vdiv).setColProp('oiv_dep_id', { editoptions:{value:edata} } );
					}
				}, 
			'json');
		}
		
// Индикация ошибок при вводе, ред., удал.
        function TestNewData(pd, formid) {
            var result = true, mess = '';
            if( pd.oiv_cli_id == '' || pd.oiv_build_id == '' || pd.oiv_inv_date == '') {
                result = false;
                mess = 'Данные введены с ошибками !!!';
            }
            return[result,mess];
        }
        
// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) {
                success = false;
                msg = rsp.errmess;
            }
				
            return [success, msg];
        }

// Навигатор - обновить
        gritab.jqGrid('navGrid', '#' + vdiv + 'Pager',
// Параметры инструментов
        {
            add: true, addtext: 'Создать', 
			del: true, deltext: 'Удалить', 
			edit: true, edittext: 'Изменить', 
			view: true, viewtext: 'Просмотр', 
			search: false,
            refresh: true, refreshtext: 'Обновить' 
        },
// Параметры редактирования
        {
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            editData: { q: 'outinvoice/update' },
			onInitializeForm: function( fm ) {
				$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
            afterShowForm: onShowEditForm,
            beforeSubmit: TestNewData, 
            afterSubmit: responseOnSubmit,
            viewPagerButtons: false,
            closeAfterEdit: true,
			onClose: onCloseEditForm
        },
// Параметры добавления
        {
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            editData: { q: 'outinvoice/insert' },
			onInitializeForm: function( fm ) {
				$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
            afterShowForm: onShowEditForm,
            beforeSubmit: TestNewData, 
            afterSubmit: responseOnSubmit,
			onClose: onCloseEditForm
        },
// Параметры удаления
        {
            modal: true,
            jqModal: true,
            width: 250,
			msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
				'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
			resize: false,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            delData: { q: 'outinvoice/delete' },
            afterShowForm: onShowDelForm,
            afterSubmit: responseOnSubmit
        },
		null,
		{
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.ui_dialog_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            viewPagerButtons: false,
			labelswidth: '35%',
			beforeShowForm: function(fm) { 
				$(fm).find("table:first td").css({'white-space':'normal','vertical-align':'top'});
				$('div#viewmod' + vdiv).shadow();
				FormCentering('div#viewmod' + vdiv);
			}
        }
        );
        
// Пользовательский навигатор - Сумма
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: 'Сумма',
            title: 'Просуммаровать выделенное',
            buttonicon: 'ui-icon-circle-plus',
            onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				var rowlist = rowarr.toString();
				if( !rowlist ) {
					app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строки в таблице.", 'app-icon-stop32');
					return; 
				}
				var summ_inv = 0;
				var summ_pay = 0;
				var summ_sub = 0;
				for( var i=0; i<rowarr.length; i++ ) {
					summ_pay += Number(gritab.getCell( rowarr[i], 'oiv_paid' ));
					summ_inv += Number(gritab.getCell( rowarr[i], 'oiv_amount' ));
				}
				summ_sub = summ_inv - summ_pay;
//				var result = "Число помеченных записей: <b>"+rowarr.length+"</b><br>"+
//							"Cумма по колонке 'Получено' : <b>"+summa.formatNumber('n2')+"</b>";
				var result = '<table><tr align="right"><td>Число помеченных записей: </td><td><b>'+rowarr.length+'</b></td></tr>'+
							 '<tr align="right"><td>Предъявлено к оплате: </td><td><b>'+summ_inv.formatNumber('n2')+'</b></td></tr>'+
							 '<tr align="right"><td>Получено оплат: </td><td><b>'+summ_pay.formatNumber('n2')+'</b></td></tr>'+
							 '<tr align="right"><td>Недополучено: </td><td><b>'+summ_sub.formatNumber('n2')+'</b></td></tr></table>';
				app.alert('AlertDlg', 'Результат', result, 'app-icon-info32');
			}
        });
		
// Пользовательский навигатор - платежи
		gritab.jqGrid('navButtonAdd',pager_id,{
			caption: 'Платежи',
			title: 'Показать/скрыть информацию по платежам',
			buttonicon: 'ui-icon-arrowstop-1-s',
			onClickButton: function() {
				if( inv_area_full ) {
					inv_area_full = false;
					area.css({'bottom':'170px'});
				}
				else {
					inv_area_full = true;
					area.css({'bottom':'0'});
				}
				me.Resize();
			}
		});    

// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

// Прикрепить календарь к ячейке поиска
//		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_oiv_inv_date") );
		
		SetPeriodFilter( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_oiv_inv_date") );
		
		function SetPeriodFilter( fm, el ) {
			$(el).prop('title', "Формат ввода: 'дд.мм.гггг'" );
			$(el).parent().append('<img class="search_bar_interval_selector" src="img/triangle-1-ne.png" title="Выбрать интервал">');
			var is = $(fm).find(".search_bar_interval_selector");
			
			is.click( function() {
				app.GetTimePeriod( 'GetTimeInterv', 'Укажите, за какой период нужно отобрать данные', 
					function( sdt, fdt ) {
						var interv = '';
						if( sdt != '' ) {
							interv = sdt;
							if( fdt != '' ) {
								if( fdt > sdt )
									interv += '-'+fdt;
								else
									interv = '';
							}
							if( interv != '' ) {
								$(el).val(interv);
								gritab[0].triggerToolbar();	
							}
						}
					}
				);
			});
		}
		
        function BindCalendar(fm, el) {
            $(el).datepicker({
				onClose: function(dt, inst) { 
					if( $(fm).hasClass('ui-search-toolbar') && dt != '' ) gritab[0].triggerToolbar();
				},
                dateFormat: "dd.mm.yy",
                showOn: "button",
                buttonImage: "img/calendar2.png",
                buttonImageOnly: true,
                buttonText: "Календарь",
                changeMonth: true,
                changeYear: true
            });

            fm.find(".ui-datepicker-trigger")
                .css({ 'cursor': 'pointer', 'position': 'relative', 'left': '-18px', 'top': '3px' });
            $(el).attr("title", "Формат ввода: 'дд.мм.гггг'");                
        }

        function SetClientsHack() {
            $(el_cli_name).autocomplete({
				html: true,
				appendTo: 'div#editmod' + vdiv,
                source: function (request, responce) {
                    $.post('index.php', { q: 'clients/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.name, value: item.value }
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
					$(el_cli_id).val(ui.item.value);
                    cli_name = ui.item.label.replace(/<(b|\/b)>/g,'');
                    $(el_cli_name).val(cli_name);
					return false;
                }
            });
			
            $(el_cli_name).bind( 'change', function () {
// Проверка, что данные получены автозаполнением. 
                if( $(el_cli_id).val() == "" || $(el_cli_name).val() != cli_name ) {
                    $(el_cli_id).val('')
                    vend_name = '';
                }
			});
        }

        function SetBuildHack() {
            $(el_build_name).autocomplete({
				html: true,
				appendTo: 'div#editmod' + vdiv,
                source: function (request, responce) {
                    $.post('index.php', { q: 'builds/find', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.name + ' ( '+item.address+' )', value: item.value,
											name:item.name, address:item.address }
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    $(el_build_id).val(ui.item.value);
                    build_name = ui.item.name.replace(/<(b|\/b)>/g,'');
                    $(el_build_name).val(build_name);
                    return false;
                }
            });
            $(el_build_name).bind( 'change', function () { 
                if( $(el_build_id).val() == "" || $(el_build_name).val() != build_name ) { 
                    build_name = '';
                    $(el_build_id).val("");
                }
            });            
        }

        function SetPmTypeHack() {
            $(el_pm_type).autocomplete({
				html: true,
				appendTo: 'div#editmod' + vdiv,
                source: function (request, responce) {
                    $.post('index.php', { q: 'payments/findallitp', term: request.term },
                    function (rsp, textStatus) {
                        if (rsp.errcode) {
                            if (rsp.errcode == '999') { alert(rsp.errmess); }
                            else app.alert('AlertDlg', 'Ошибка', rsp.errmess, 'app-icon-stop32');
                            responce();
                            return;
                        }
                        if (rsp.data) {
                            responce($.map(rsp.data, function (item) {
                                return { label: item.itp_code + ' ( '+item.itp_descr+' )', value: item.itp_code }
                            }));
                            return;
                        }
                        responce();
                    }, 
                    'json');
                },
                minLength: 2, autoFocus: true,
                focus: function (event, ui) { return false; },
                select: function (event, ui) {
                    pm_type = ui.item.value.replace(/<(b|\/b)>/g,'');
                    $(el_pm_type).val(pm_type);
                    return false;
                }
            });
			pm_type = $(el_pm_type).val();
            $(el_pm_type).bind( 'focusout', function () { 
                if( $(el_pm_type).val() != pm_type ) { 
                    pm_type = '';
                    $(el_pm_type).val("");
                }
            });
        }
		
		this.Destroy = function() {
//			$("#gview_" + vdiv + " #gs_oiv_inv_date").datepicker( "destroy" ).unbind();
			$("#gview_" + vdiv + " .search_bar_interval_selector").unbind();
			gritab.GridDestroy(vdiv);
			area.find('*').remove();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.innerWidth() - 2 );
			gritab.setGridHeight( area.innerHeight() - 77 );
		};
		this.Refresh = function() {
			gritab.trigger("reloadGrid");
		};

	};  // End of create function definition


    function OutinvPays(area_id, caller) {
        var vdiv = area_id+'Tab';
		var area = $('#'+area_id);

		area.css({'overflow':'hidden'})
		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');
        
		var pager_id = '#' + vdiv + 'Pager';
		var pager = $(pager_id);

		var el_ord_date;

        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5];
        var col_names = ['ID', 'Inv_ID', 'Дата платежа', '№ Платежа', 'Сумма', 'Комментарий'];
        var col_model = [
		    { name: 'id', index: 'oip_id', hidden: true, width: 1, editable: false, fixed: true },
		    { name: 'oip_inv_id', index: 'oip_inv_id', hidden: true, width: 1, editable: false, fixed: true },
			{ name: 'oip_ord_date', index:'oip_ord_date', hidden: false, width:80, editable: true,
            	editoptions: { style: "width:250px;", dataInit: function (el) { el_ord_date = el; } },
				formoptions: { label: '<div class="jqg-form-label">Дата платежа</div>'}
			},         
		    { name: 'oip_ord_num', index: 'oip_ord_num', hidden: false, width: 80, editable: true,
            	editoptions: { maxlength: "32", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Номер платежа</div>'}
		    },
		    { name: 'oip_amount', index: 'oip_amount', hidden: false, width: 80, editable: true,
            	editoptions: { maxlength: "16", style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Сумма платежа</div>'}
		    },
		    { name: 'oip_comment', index: 'oip_comment', hidden: false, width: 150, editable: true,
		        editoptions: { maxlength: "128",  style: "width:250px;" },
				formoptions: { label: '<div class="jqg-form-label">Комментарий</div>'}
		    }
        ];

        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'outinvoice/paylist' },
            emptyrecords: true,
            autowidth: false,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 30,
            multiboxonly: true,
            mtype: 'POST',
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 3,
            rowList: [3, 30],
            loadui: 'disable',
            toolbar: [false, 'top'],
			toppager: false,
            filterbar: false,
            shrinkToFit: true,
            height: area.parent().innerHeight() - 100,
            width: area.parent().innerWidth() - 2,
            sortname: 'oip_ord_date',
            sortorder: 'asc',
            sortable: true,
            caption: '',
            loadError: function () {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32' );
                        break;
                }
            },
			beforeRequest: function() {
				$('#' + vdiv).jqGrid('setGridParam',{postData:{'oiv_id':oiv_id} });
			},
            ondblClickRow: function (id, iRow, iCol) {
                $('#' + vdiv).jqGrid('editGridRow', id,
                {
					width: 450,
					resize: false,
                    modal: true,
                    jqModal: true,
//                    zIndex: app.jqgrid_form_min_z_index,
					zIndex: app.ui_dialog_min_z_index+1,
                    closeOnEscape: true,
// Autocomplete Select savekey must be disabled
//                    savekey: [true, 13],
                    editData: { q: 'outinvoice/payupdate', oiv_id: function() { return oiv_id; } },
					onInitializeForm: function( fm ) {
						$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
                    afterShowForm: onShowEditForm,
					beforeSubmit: TestNewData, 
                    afterSubmit: responseOnSubmit,
                    viewPagerButtons: false,
                    closeAfterEdit: true,
					onClose: onCloseEditForm
                }
                );
            }
        };

		function FormCentering( form_id ) {
			var wh = $(window).height();
			var ww = $(window).width();
			var fmdlg = $(form_id);
			var fh = fmdlg.height();
			var fw = fmdlg.width();
			fmdlg.css({	'top': (wh - fh)/2,	'left': (ww -fw)/2 });
		}
		
		function onShowEditForm(fm) {
            BindCalendar(fm, el_ord_date);
            $('div#editmod' + vdiv).css({'overflow':'visible'}).shadow();
			FormCentering('div#editmod' + vdiv);
		}
		        
		function onCloseEditForm() {
			$(el_ord_date).datepicker( "destroy" ).unbind();
			return true;
		}
		
		function onShowDelForm() {
            $('div#delmod' + vdiv).shadow();
			FormCentering('div#delmod' + vdiv);
		}
				
// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Индикация ошибок при вводе, ред., удал.
        function TestNewData(pd, formid) {
            var result = true, mess = '';
            if( pd.oip_amount == '' || pd.oip_ord_num == '' || pd.oip_ord_date == '') {
                result = false;
                mess = 'Данные введены с ошибками !!!';
            }
            return[result,mess];
        }
        
// Индикация серверных ошибок добавления, ред., удал.
        function responseOnSubmit(response, postdata) {
            var rsp = $.parseJSON(response.responseText);
            var success = true;
            var msg = '';

            if (rsp.errcode) {
                success = false;
                msg = rsp.errmess;
            }
			else
				caller.RefreshMaster();

            return [success, msg];
        }

// Навигатор - обновить
        gritab.jqGrid('navGrid', '#' + vdiv + 'Pager',
// Параметры инструментов
        {
            add: true, // addtext: 'Создать', 
			del: true, // deltext: 'Удалить', 
			edit: true, // edittext: 'Изменить', 
			view: false, 
			search: false,
            refresh: true, // refreshtext: 'Обновить', 
			afterRefresh: function () { gritab.resetSelection(); }
        },
// Параметры редактирования
        {
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            editData: { q: 'outinvoice/payupdate', oiv_id: function() { return oiv_id; } },
			onInitializeForm: function( fm ) {
				$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
            afterShowForm: onShowEditForm,
            beforeSubmit: TestNewData, 
            afterSubmit: responseOnSubmit,
            viewPagerButtons: false,
            closeAfterEdit: true,
			onClose: onCloseEditForm
        },
// Параметры добавления
        {
			width: 450,
			resize: false,
            modal: true,
            jqModal: true,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            editData: { q: 'outinvoice/payinsert', oiv_id: function() { return oiv_id; } },
			onInitializeForm: function( fm ) {
				$(fm).prepend('<style type="text/css">.ui-autocomplete {max-width:252px;}</style>'); },
            afterShowForm: onShowEditForm,
            beforeSubmit: TestNewData, 
            afterSubmit: responseOnSubmit,
			onClose: onCloseEditForm
        },
// Параметры удаления
        {
            modal: true,
            jqModal: true,
            width: 250,
			msg: '<table style="width:240px;margin-top:16px;"><tr><td style="width:50px;">'+
				'<div class="app-icon-quest32"></div></td><td>Удалить выбранную запись(и) ?</td></tr></table>',
			resize: false,
//            zIndex: app.jqgrid_form_min_z_index,
			zIndex: app.ui_dialog_min_z_index+1,
            closeOnEscape: true,
            delData: { q: 'outinvoice/paydelete', oiv_id: function() { return oiv_id; } },
            afterShowForm: onShowDelForm,
            afterSubmit: responseOnSubmit
        }
        );
        
// Пользовательский навигатор - Сумма
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: '',
            title: 'Просуммаровать выделенное',
            buttonicon: 'ui-icon-circle-plus',
            onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				var rowlist = rowarr.toString();
				if( !rowlist ) {
					app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строки в таблице.", 'app-icon-stop32');
					return; 
				}
				var summa = 0;
				for( var i=0; i<rowarr.length; i++ ) {
					summa += Number(gritab.getCell( rowarr[i], 'oip_amount' ));
				}
				var result = "Число помеченных записей: <b>"+rowarr.length+"</b><br>"+
							"Cумма по колонке 'Сумма' : <b>"+summa.formatNumber('n2')+"</b>";
				app.alert('AlertDlg', 'Результат', result, 'app-icon-info32');
			}
        });
		
// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

// Прикрепить календарь к ячейке поиска
//		BindCalendar( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_oip_ord_date") );
		
		SetPeriodFilter( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_oip_ord_date") );
		
		function SetPeriodFilter( fm, el ) {
			$(el).prop('title', "Формат ввода: 'дд.мм.гггг'" );
			$(el).parent().append('<img class="search_bar_interval_selector" src="img/triangle-1-ne.png" title="Выбрать интервал">');
			var is = $(fm).find(".search_bar_interval_selector");
			
			is.click( function() {
				app.GetTimePeriod( 'GetTimeInterv', 'Укажите, за какой период нужно отобрать данные', 
					function( sdt, fdt ) {
						var interv = '';
						if( sdt != '' ) {
							interv = sdt;
							if( fdt != '' ) {
								if( fdt > sdt )
									interv += '-'+fdt;
								else
									interv = '';
							}
							if( interv != '' ) {
								$(el).val(interv);
								gritab[0].triggerToolbar();	
							}
						}
					}
				);
			});
		}
		
        function BindCalendar(fm, el) {
            $(el).datepicker({
				onClose: function(dt, inst) { 
					if( $(fm).hasClass('ui-search-toolbar') && dt != '' ) gritab[0].triggerToolbar();
				},
                dateFormat: "dd.mm.yy",
                showOn: "button",
                buttonImage: "img/calendar2.png",
                buttonImageOnly: true,
                buttonText: "Календарь",
                changeMonth: true,
                changeYear: true
            });

            fm.find(".ui-datepicker-trigger")
                .css({ 'cursor': 'pointer', 'position': 'relative', 'left': '-18px', 'top': '3px' });
            $(el).attr("title", "Формат ввода: 'дд.мм.гггг'");                
        }

		this.Destroy = function() {
			$("#gview_" + vdiv + " .search_bar_interval_selector").unbind();
			gritab.GridDestroy(vdiv);
			area.find('*').remove();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.parent().innerWidth() - 2 );
			gritab.setGridHeight( area.parent().innerHeight() - 100 );
		};
		this.Refresh = function() {
			gritab.trigger("reloadGrid");
		};

	};  // End of create function definition


    function FullPayList(area_id, caller) {
        var vdiv = area_id+'Tab';
		var area = $('#'+area_id);

		area.css({'overflow':'hidden'})
		area.html('<div id="'+vdiv+'Pager"></div><table id="'+vdiv+'"></table>');
        
		var pager_id = '#' + vdiv + 'Pager';
		var pager = $(pager_id);

		var el_ord_date;

        var gritab;
        var col_order = [0, 1, 2, 3, 4, 5, 6, 7, 8];
        var col_names = ['ID', 'Inv_ID', 'Дата пл.', '№ Платежа', 'Сумма', 'Дата счета', '№ Счета', 'Объект', 'Комментарий'];
        var col_model = [
		    { name: 'id', index: 'oip_id', hidden: true, width: 1, editable: false, fixed: true },
		    { name: 'oip_inv_id', index: 'oip_inv_id', hidden: true, width: 1, editable: false, fixed: true },
			{ name: 'oip_ord_date', index:'oip_ord_date', hidden: false, width:80, editable: false	},         
		    { name: 'oip_ord_num', index: 'oip_ord_num', hidden: false, width: 80, editable: false },
		    { name: 'oip_amount', index: 'oip_amount', hidden: false, width: 80, editable: false },
			{ name: 'oiv_inv_date', index:'oiv_inv_date', hidden: false, width:80, editable: false },         
		    { name: 'oiv_inv_num', index: 'oiv_inv_num', hidden: false, width: 80, editable: false },
		    { name: 'build_name', index: 'build_name', hidden: false, width: 80, editable: false },
		    { name: 'oip_comment', index: 'oip_comment', hidden: false, width: 80, editable: false },
        ];

        var jqgo = {
            url: 'index.php',
            editurl: 'index.php',
            datatype: 'json',
            postData: { q: 'outinvoice/fullpaylist' },
            emptyrecords: true,
            autowidth: false,
            gridview: true,
            hidegrid: false,
            hoverrows: true,
            recordpos: 'right',
            scrollrows: true,
            multiselect: true,
            multiselectWidth: 30,
            multiboxonly: true,
            mtype: 'POST',
            colNames: col_names,
            colModel: col_model,
            page: 1,
            pager: pager,
            pagerpos: 'right',
            rowNum: 3,
            rowList: [3, 30],
            loadui: 'disable',
            toolbar: [false, 'top'],
			toppager: false,
            filterbar: false,
            shrinkToFit: true,
            height: area.parent().innerHeight() - 100,
            width: area.parent().innerWidth() - 2,
            sortname: 'oip_ord_date',
            sortorder: 'asc',
            sortable: true,
            caption: '',
            loadError: function () {
                alert("Ошибка загрузки даных");
            },
            loadComplete: function (data) {
                switch( data.userdata.errcode ) {
                    case 0:
                        break;
                    case 99:    
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32', caller.Close );
                        break;
                    default:
                        app.alert('AlertDlg', 'Ошибка', data.userdata.errmess, 'app-icon-stop32' );
                        break;
                }
            },
			beforeRequest: function() {
//				$('#' + vdiv).jqGrid('setGridParam',{postData:{'oiv_id':oiv_id} });
			}
        };

// Создадим jqGrid
        gritab = $('#' + vdiv).jqGrid(jqgo);

// Навигатор - обновить
        gritab.jqGrid('navGrid', '#' + vdiv + 'Pager',
// Параметры инструментов
        {
            add: false, del: false, edit: false, view: false, search: false,
            refresh: true, // refreshtext: 'Обновить'
        }
        );
        
// Пользовательский навигатор - Сумма
        gritab.jqGrid('navButtonAdd', pager_id, {
            caption: '',
            title: 'Просуммаровать выделенное',
            buttonicon: 'ui-icon-circle-plus',
            onClickButton: function() {
				var rowarr = gritab.getGridParam('selarrrow');
				var rowlist = rowarr.toString();
				if( !rowlist ) {
					app.alert('AlertDlg', 'Внимание', "Пожалуйста, выберите строки в таблице.", 'app-icon-stop32');
					return; 
				}
				var summa = 0;
				for( var i=0; i<rowarr.length; i++ ) {
					summa += Number(gritab.getCell( rowarr[i], 'oip_amount' ));
				}
				var result = "Число помеченных записей: <b>"+rowarr.length+"</b><br>"+
							"Cумма по колонке 'Сумма' : <b>"+summa.formatNumber('n2')+"</b>";
				app.alert('AlertDlg', 'Результат', result, 'app-icon-info32');
			}
        });
		
// Делаем ширину панели кнопок максимальной
		$('td#'+area_id+'TabPager_center').width(2);
		
        gritab.filterToolbar({ searchOnEnter: false, afterSearch: function () { } });

// Прикрепить календарь к ячейке поиска
		SetPeriodFilter( $("#gview_"+vdiv+" tr.ui-search-toolbar"), $("#gview_" + vdiv + " #gs_oip_ord_date") );
		
		function SetPeriodFilter( fm, el ) {
			$(el).prop('title', "Формат ввода: 'дд.мм.гггг'" );
			$(el).parent().append('<img class="search_bar_interval_selector" src="img/triangle-1-ne.png" title="Выбрать интервал">');
			var is = $(fm).find(".search_bar_interval_selector");
			
			is.click( function() {
				app.GetTimePeriod( 'GetTimeInterv', 'Укажите, за какой период нужно отобрать данные', 
					function( sdt, fdt ) {
						var interv = '';
						if( sdt != '' ) {
							interv = sdt;
							if( fdt != '' ) {
								if( fdt > sdt )
									interv += '-'+fdt;
								else
									interv = '';
							}
							if( interv != '' ) {
								$(el).val(interv);
								gritab[0].triggerToolbar();	
							}
						}
					}
				);
			});
		}
		
		this.Destroy = function() {
			$("#gview_" + vdiv + " .search_bar_interval_selector").unbind();
			gritab.GridDestroy(vdiv);
			area.find('*').remove();
		};
		this.Resize = function() {
			gritab.setGridWidth( area.parent().innerWidth() - 2 );
			gritab.setGridHeight( area.parent().innerHeight() - 100 );
		};
		this.Refresh = function() {
			gritab.trigger("reloadGrid");
		};

	};  // End of create function definition


	function OutinvoiceProxy() {
		var oTab, area;
		
		var area;
		var inv_area, pay_area, fpl_area;
		var oInvTab, oPayTab, oFplTab;
		var active = false;
		var pay_area_title;
		
		this.Open = function( area_id ) {
			if( active  ) return;
			area = area_id;
			$('#'+area+'Title').show();
			inv_area = area_id + '_Invoices';
			pay_area = area_id + '_Payments';
			fpl_area = area_id + '_FullPayList';
			pay_area_title = area_id + '_PaymentsTitle';
			inv_area_full = true;
			$('#'+area_id).append(
				'<div style="position:absolute;bottom:0;left:0;width:40%;height:170px;">'+
					'<span id="'+pay_area_title+'" style="line-height:24px;margin-left:8px;">'+
					'Платежи по счету </span>'+
					'<div id="'+pay_area+'"></div>'+
				'</div>'+
				'<div style="position:absolute;bottom:0;right:0;width:60%;height:170px;">'+
					'<span style="line-height:24px;margin-left:8px;">'+
					'Полный список платежей </span>'+
					'<div id="'+fpl_area+'"></div>'+
				'</div>'
			);
			$('#'+area_id).append('<div id="'+
				inv_area+'" style="position:absolute;top:0;left:0;bottom:0;width:100%;"></div>');
				
			oiv_id = 0;
			oFplTab = new FullPayList( fpl_area, this ); 
			$(window).bind( 'resize', oFplTab.Resize );
			oPayTab = new OutinvPays( pay_area, this ); 
			$(window).bind( 'resize', oPayTab.Resize );
			oInvTab = new Outinvoice( inv_area, this ); 
			$(window).bind( 'resize', oInvTab.Resize );
			active = true;
		};
		this.Close = function() { 
			if( !active  ) return;
			$(window).unbind( 'resize', oInvTab.Resize );
			$(window).unbind( 'resize', oPayTab.Resize );
			$(window).unbind( 'resize', oFplTab.Resize );
			oInvTab.Destroy();
			oPayTab.Destroy();
			oFplTab.Destroy();
			$('#'+area).empty();
			$('#'+area+'Title').hide();
			active = false;
		};
		this.Resize = function() { 
			oInvTab.Resize(); 
			oPayTab.Resize(); 
			oFplTab.Resize(); 
		};
		this.RefreshSlave = function() { 
			$('#'+pay_area_title).html('Платежи по счету  <b>'+oiv_title+'</b>');
			oPayTab.Refresh(); 
		};
		this.RefreshMaster = function() { oInvTab.Refresh(); };
	}
	
	app.Outinvoice = new OutinvoiceProxy();

    // ---------------------------------------------------------------------------
})(jQuery);
